package com.example.interesting.distributed.lock.realize.aop;

import org.springframework.aop.ClassFilter;
import org.springframework.aop.MethodMatcher;
import org.springframework.aop.Pointcut;
import org.springframework.util.Assert;

import java.lang.annotation.Annotation;

/**
 * @author fyw
 * @version 1.0
 * @description: 定义切点相关信息设置对应的方法匹配规则
 * @date 2024/3/10 14:21
 */
public class DistributedLockAnnotationPoint implements Pointcut {

    /**
     * 注解类
     */
    private final Class<? extends Annotation> annotationClass;

    public DistributedLockAnnotationPoint(Class<? extends Annotation> annotationClass) {
        Assert.notNull(annotationClass, "annotationClass is null");
        this.annotationClass = annotationClass;
    }

    /**
     * ClassFilter 接口定义了一种筛选条件，用于确定哪些类的方法将会被代理。
     * 如果你希望对特定类中的方法进行代理，可以在 getClassFilter 方法中返回相应的 ClassFilter 实现
     */
    @Override
    public ClassFilter getClassFilter() {
        //代理所有类
        return ClassFilter.TRUE;
    }

    @Override
    public MethodMatcher getMethodMatcher() {
        //设置的具体方法匹配规则
        return new DistributedLockPointMethodMatcher(annotationClass);
    }
}
